############################################################################
## 编译说明
## 编译过程使用动态库编译driver文件下面的所有驱动文件，生成一个动态so文件库，在通过core源文件编译成为一个可执行文件
## driver模块是一个独立运行的模块，模块下面通过多个线程来驱动不同的模块，同时通过进程间交互发布订阅通信数据。
## 同时driver模块为了方便其他模块调用，通过生成动态库，并将动态库安装到Linux系统中，其他模块可以直接调用
## CMake之install方法的使用:https://zhuanlan.zhihu.com/p/102955723
############################################################################

# VERSION需要和本机安装的Cmake对应
cmake_minimum_required(VERSION 3.16.3) 

# 指定了当前的工程名称，最后输出的可执行文件名称，赋值给了{PROJECT_NAME}变量
project(app_mower_driver) 

# c++ 11
set(CMAKE_CXX_FLAGS "-std=c++11")
#set(Protobuf_PROTOC_EXECUTABLE "/usr/local/bin/protoc")


# 引入外部依赖包
find_package(OpenCV REQUIRED)
find_package(Protobuf REQUIRED)
find_package(eCAL REQUIRED)
find_package(spdlog REQUIRED)

# 引入外部项目
add_subdirectory(external/mower_ipc/proto)

# 添加头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/api)
include_directories(${PROJECT_SOURCE_DIR}/external/mower_ipc/proto/message)
include_directories(${OpenCV_INCLUDE_DIRS})

# 查找指定目录下的所有.cpp与.h文件 并存放到指定变量名{SC_FILES}中
FILE(GLOB 
    SC_FILES 
    ${PROJECT_SOURCE_DIR}/src/api/*.cpp 
    ${PROJECT_SOURCE_DIR}/src/driver/*.cpp 
    ${PROJECT_SOURCE_DIR}/src/device/*.cpp 
    ${PROJECT_SOURCE_DIR}/src/tool/*.cpp 
    ${PROJECT_SOURCE_DIR}/src/tool/jsoncpp/*.cpp 
    ${PROJECT_SOURCE_DIR}/external/mower_ipc/proto/message/*.cc
    )

if(0)
#####生成一个动态库
# 为链接动态库添加动态库需要的源文件， SHARED参数代表动态库 STATIC参数代表静态库
add_library (${PROJECT_NAME} SHARED ${SC_FILES})
# 生成一个动态库或者静态库
target_link_libraries ( 
    ${PROJECT_NAME} 
    protobuf::libprotobuf 
    #${OpenCV_LIBS} 
    pthread
    eCAL::core
    spdlog::spdlog
    )

#set(LINK_DIR ${PROJECT_SOURCE_DIR}/bulid)
#link_directories(${LINK_DIR})
#####根据上面生成的动态库生成可执行文件
# 使用指定的源文件创建出一个可执行文件，第一个变量必须是可执行文件的名字，后面默认是其他源文件
add_executable(testappso ${PROJECT_SOURCE_DIR}/src/main.cpp) 
# 指定链接给定目标和/或其依赖项时要使用的库或标志，链接动态库静态库等
target_link_libraries(testappso ${PROJECT_NAME})

else()
#####生成可执行文件
# 使用指定的源文件创建出一个可执行文件，第一个变量必须是可执行文件的名字，后面默认是其他源文件
add_executable(${PROJECT_NAME} ${SC_FILES} ${PROJECT_SOURCE_DIR}/src/main.cpp) 
# 指定链接给定目标和/或其依赖项时要使用的库或标志，链接动态库静态库等
target_link_libraries(${PROJECT_NAME} 
    protobuf::libprotobuf 
    eCAL::core
    #${OpenCV_LIBS} 
    pthread
    spdlog::spdlog
)


add_executable(rtkPub ${SC_FILES} ${PROJECT_SOURCE_DIR}/test/rtkPub.cpp) 
# 指定链接给定目标和/或其依赖项时要使用的库或标志，链接动态库静态库等
target_link_libraries(rtkPub
    protobuf::libprotobuf 
    eCAL::core
    #${OpenCV_LIBS} 
    pthread
    spdlog::spdlog
)

# 使用指定的源文件创建出一个可执行文件，第一个变量必须是可执行文件的名字，后面默认是其他源文件
add_executable(ecalsub ${SC_FILES} ${PROJECT_SOURCE_DIR}/test/EcalSub.cpp) 
# 指定链接给定目标和/或其依赖项时要使用的库或标志，链接动态库静态库等
target_link_libraries(ecalsub 
    protobuf::libprotobuf 
    #${OpenCV_LIBS} 
    eCAL::core
    pthread
)
# 使用指定的源文件创建出一个可执行文件，第一个变量必须是可执行文件的名字，后面默认是其他源文件
add_executable(ecalpub ${SC_FILES} ${PROJECT_SOURCE_DIR}/test/EcalPub.cpp) 
# 指定链接给定目标和/或其依赖项时要使用的库或标志，链接动态库静态库等
target_link_libraries(ecalpub 
    protobuf::libprotobuf 
    #${OpenCV_LIBS} 
    eCAL::core
    pthread
)

endif()
# install(TARGETS ${PROJECT_NAME}  
#     ARCHIVE DESTINATION lib # 静态库安装路径
#     LIBRARY DESTINATION lib # 动态库安装路径
#     RUNTIME DESTINATION bin # 可执行文件安装路径
#     PUBLIC_HEADER DESTINATION include  # 头文件安装路径
#     )

# 使用指定的源文件创建出一个可执行文件，第一个变量必须是可执行文件的名字，后面默认是其他源文件
# add_executable(testapp 
#     ${PROJECT_SOURCE_DIR}/test/test_driver_usart.cpp
# ) 

#install(FILES
#    config/driver_params.txt
#    DESTINATION config
#    )
  